﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Mirkuz.PowerManagement
{
    /// <summary>
    /// funzioni di power management generiche
    /// </summary>
    public static class PowerManager
    {
        /// <summary>
        /// Esegue automaticamente un programma a una certa ora
        /// </summary>
        /// <param name="app">programma da eseguire</param>
        /// <param name="when">ora di esecuzione</param>
        public static void LaunchAppAtTime(string app, DateTime when)
        {
            SystemTime t = new SystemTime(when);
            PMAPI.CeRunAppAtTime(app, ref t);            
        }

        /// <summary>
        /// manda il pocketpc in suspend
        /// </summary>
        public static void SuspendDevice()
        {
            PMAPI.SetSystemPowerState(null,(uint) PowerState.POWER_STATE_SUSPEND, 0);
        }
        /// <summary>
        /// effettua il resume del pocketpc
        /// </summary>
        public static void ResumeDevice()
        {
            PMAPI.SetSystemPowerState(null, (uint)PowerState.POWER_STATE_ON, 0);     
        }

        /// <summary>
        /// Imposta lo stato minimo richiesto per un device
        /// </summary>
        /// <param name="device">es BKL1:</param>
        /// <param name="req">stato minimo richiesto</param>
        /// <returns>handle del vincolo creato</returns>
        public static IntPtr SetRequirement(string device,CEDEVICE_POWER_STATE req)
        {
            IntPtr lastreq=IntPtr.Zero;
            try
            {               
                lastreq = PMAPI.SetPowerRequirement(device, (int) req, (PMAPI.POWER_FORCE | PMAPI.POWER_NAME), IntPtr.Zero, 0);
            }
            catch {}

            if (lastreq==IntPtr.Zero){ 
                if (device!=null)
                    throw new Exception("Errore nell'esecuzione di SetPowerRequirement(" + device + ")");
                else
                    throw new Exception("Errore nell'esecuzione di SetPowerRequirement(NULL)");
            }

            return lastreq;
        }
        /// <summary>
        /// Rimuove un vincolo richiesto con SetRequirement
        /// </summary>
        /// <param name="RequirementHandle">Handle del vincolo</param>
        public static void ReleaseRequirement(IntPtr RequirementHandle)
        {
            try
            {
                PMAPI.ReleasePowerRequirement(RequirementHandle);
            }
            catch { }
        }

        /// <summary>
        /// Forza un device nello stato impostato
        /// </summary>
        /// <param name="device">es BKL1:</param>
        /// <param name="req">stato richiesto</param>
        public static void SetPower(string device, CEDEVICE_POWER_STATE req)
        {
            UInt32 retval=1;
            try
            {
                retval = PMAPI.DevicePowerNotify(device, (int)req, PMAPI.POWER_NAME);
            }
            catch { }
            if (retval!=0)
                if (device!=null)
                    throw new Exception("Errore nell'esecuzione di DevicePowerNotify(" + device +")");
                else
                    throw new Exception("Errore nell'esecuzione di DevicePowerNotify(NULL)");
        }

        /// <summary>
        /// azzera il conteggio idle del sistema
        /// </summary>
        public static void ResetIdleTimer()
        {
            PMAPI.SystemIdleTimerReset();
        }
 
    }
}
